import ctypes
import sys
import os

# 获取当前文件的绝对路径
current_file_path = os.path.abspath(__file__)

# 获取当前文件所在的目录
current_directory = os.path.dirname(current_file_path)

# 将当前文件所在的目录添加到 sys.path
if current_directory not in sys.path:
    sys.path.append(current_directory)
# 加载 DLL
dll_path = os.path.realpath('dll/WJ_API.dll')
print(dll_path)

try:
    wj_api = ctypes.CDLL(dll_path)
except OSError as e:
    print(f"无法加载 WJ_API2.dll: {e}")
    sys.exit(1)

# 定义函数原型
wj_api.WJ_Open.argtypes = [ctypes.c_int]
wj_api.WJ_Open.restype = ctypes.c_int32

wj_api.WJ_Close.argtypes = []
wj_api.WJ_Close.restype = ctypes.c_int32

wj_api.WJ_Get_Axis_Status.argtypes = [ctypes.c_int32, ctypes.POINTER(ctypes.c_int32)]
wj_api.WJ_Get_Axis_Status.restype = ctypes.c_int32

# 新增 WJ_Get_Axis_Vel 的函数原型
wj_api.WJ_Get_Axis_Vel.argtypes = [ctypes.c_int32, ctypes.POINTER(ctypes.c_int32)]
wj_api.WJ_Get_Axis_Vel.restype = ctypes.c_int32

# 定义WJ_Set_Axis_Vel函数原型
wj_api.WJ_Set_Axis_Vel.argtypes = [ctypes.c_int32, ctypes.c_int32]
wj_api.WJ_Set_Axis_Vel.restype = ctypes.c_int32

# 定义走脉冲运动函数原型
wj_api.WJ_Move_Axis_Pulses.argtypes = [ctypes.c_int32, ctypes.c_int32]
wj_api.WJ_Move_Axis_Pulses.restype = ctypes.c_int32
# 定义走脉冲运动(所有轴)函数原型
wj_api.WJ_Move_Axes_Pulses.argtypes = [ctypes.POINTER(ctypes.c_int32)]
wj_api.WJ_Move_Axes_Pulses.restype = ctypes.c_int32

# 定义 WJ_Get_Axis_Pulses 函数原型
wj_api.WJ_Get_Axis_Pulses.argtypes = [ctypes.c_int32, ctypes.POINTER(ctypes.c_int32)]
wj_api.WJ_Get_Axis_Pulses.restype = ctypes.c_int32

# 定义 WJ_Get_Axes_Pulses 函数原型
wj_api.WJ_Get_Axes_Pulses.argtypes = [ctypes.POINTER(ctypes.c_int32)]
wj_api.WJ_Get_Axes_Pulses.restype = ctypes.c_int32

# 定义函数原型
wj_api.WJ_Set_Axis_Pulses_Zero.argtypes = [ctypes.c_int32]
wj_api.WJ_Set_Axis_Pulses_Zero.restype = ctypes.c_int32


# 获取所有轴的状态
def get_all_axes_status():
    # 获取轴数
    axes_num = ctypes.c_int32(0)
    result = wj_api.WJ_Get_Axes_Num(ctypes.byref(axes_num))
    if result != 0:
        print(f"WJ_Get_Axes_Num 失败，错误码: {result}")
        return

    # 获取所有轴的状态
    axes_status = (ctypes.c_int32 * axes_num.value)()
    result = wj_api.WJ_Get_Axes_Status(axes_status)
    if result == 0:
        for i in range(axes_num.value):
            print(f"轴 {i + 1} 的状态: {axes_status[i]}")
    else:
        print(f"WJ_Get_Axes_Status 失败，错误码: {result}")


# 获取指定轴的速度
def get_axis_velocity(axis_num):
    p_value = ctypes.c_int32()
    result = wj_api.WJ_Get_Axis_Vel(axis_num, ctypes.byref(p_value))
    if result == 0:
        print(f"轴 {axis_num} 的速度: {p_value.value}")
        return p_value.value
    else:
        print(f"WJ_Get_Axis_Vel 失败，错误码: {result}")


# 紧急停止指定轴
def emergency_stop_axis(axis_num):
    result = wj_api.WJ_Move_Axis_Emergency_Stop(axis_num)
    if result == 0:
        print(f"轴 {axis_num} 紧急停止成功")
    else:
        print(f"轴 {axis_num} 紧急停止失败，错误码: {result}")


# 设置指定轴的速度
def set_axis_velocity(axis_num, value):
    result = wj_api.WJ_Set_Axis_Vel(axis_num, value)
    if result == 0:
        print(f"轴 {axis_num} 速度设置成功，速度: {value}")
    else:
        print(f"轴 {axis_num} 速度设置失败，错误码: {result}")


# 移动指定轴的脉冲数
def move_axis_pulses(axis_num, value):
    result = wj_api.WJ_Move_Axis_Pulses(axis_num, value)
    if result == 0:
        print(f"轴 {axis_num} 移动脉冲数 {value} 成功")
    else:
        print(f"轴 {axis_num} 移动脉冲数 {value} 失败，错误码: {result}")


# 移动多个轴的脉冲数
def move_axes_pulses(p_value_axes):
    num_axes = len(p_value_axes)
    # 创建 C 类型数组类型
    array_type = ctypes.c_int32 * num_axes
    # 实例化数组
    p_value_axes_array = array_type(*p_value_axes)
    result = wj_api.WJ_Move_Axes_Pulses(p_value_axes_array)
    if result == 0:
        print(f"移动多个轴的脉冲数成功")
    else:
        print(f"移动多个轴的脉冲数失败，错误码: {result}")


# 获取指定轴的脉冲数
def get_axis_pulses(axis_num):
    p_value = ctypes.c_int32()
    result = wj_api.WJ_Get_Axis_Pulses(axis_num, ctypes.byref(p_value))
    if result == 0:
        print(f"轴 {axis_num} 的脉冲数: {p_value.value}")
        return p_value.value
    else:
        print(f"WJ_Get_Axis_Pulses 失败，错误码: {result}")
        return 0



# 获取所有轴的脉冲数
def get_axes_pulses():
    # 获取轴数
    axes_num = ctypes.c_int32(0)
    result = wj_api.WJ_Get_Axes_Num(ctypes.byref(axes_num))
    if result != 0:
        print(f"WJ_Get_Axes_Num 失败，错误码: {result}")
        return

    # 获取所有轴的脉冲数
    axes_pulses = (ctypes.c_int32 * axes_num.value)()
    result = wj_api.WJ_Get_Axes_Pulses(axes_pulses)
    if result == 0:
        for i in range(axes_num.value):
            print(f"轴 {i + 1} 的脉冲数: {axes_pulses[i]}")
    else:
        print(f"WJ_Get_Axes_Pulses 失败，错误码: {result}")


def set_axis_pulses_zero(axis_num):
    """
    调用 WJ_Set_Axis_Pulses_Zero 函数

    :param axis_num: 轴编号
    :return: 返回值 (INT32)
    """
    return wj_api.WJ_Set_Axis_Pulses_Zero(axis_num)


if __name__ == "__main__":
    # 通信初始化
    com_port = 0  # 假设使用 COM0
    result = wj_api.WJ_Open(com_port)
    if result != 0:
        print(f"WJ_Open 失败，错误码: {result}")
        sys.exit(1)

    # 获取所有轴的状态
    get_all_axes_status()

    # 获取指定轴的速度
    axis_num = 1  # 假设查询第 1 个轴的速度
    get_axis_velocity(axis_num)

    # 获取指定轴的脉冲数
    get_axis_pulses(axis_num)

    # 获取所有轴的脉冲数
    get_axes_pulses()

    # 关闭通信
    result = wj_api.WJ_Close()
    if result != 0:
        print(f"WJ_Close 失败，错误码: {result}")
        sys.exit(1)

    sys.exit(0)
